# 爬虫项目(重构) -- COVID-19
import requests
from bs4 import BeautifulSoup
import re
import json
from tqdm import tqdm

class CoronaVirusSpider(object):
    def __init__(self):
        self.home_url = 'http://ncov.dxy.cn/ncovh5/view/pneumonia'

    def get_content_from_url(self, url):
        """
        根据url,获取相应内容的字符串数据
        :param url: 请求的url
        :return: 相应内容的字符串
        """
        # 1.发送请求 获取疫情首页
        response = requests.get(url)
        return response.content.decode()

    def parse_home_page(self, home_page):
        """
        解析首页内容,获取解析后的python数据
        :param home_page: 首页内容
        :return: 解析后的python数据
        """
        # 2.提取一日各国疫情数据
        soup = BeautifulSoup(home_page, 'lxml')
        script = soup.find(id='getListByCountryTypeService2true')
        text = script.string

        # 3.从数据中获取json格式的字符串
        json_str = re.findall(r'\[.+\]', text)[0]

        # 4.把json格式字符串转换为python类型
        data = json.loads(json_str)

        return data

    def save(self, data, path):

        # 5.以json格式保存最近1日各国疫情数据
        with open(path, 'w', encoding='utf-8') as fp:
            json.dump(data, fp, ensure_ascii=False)

    def crawl_last_day_corona_virus(self):
        """
        采集最近一天各国的疫情信息
        """
        # 1.发送请求获取首页内容
        home_page = self.get_content_from_url(self.home_url)
        # 2.解析首页内容，获取最近一天各国数据
        last_day_corona_virus = self.parse_home_page(home_page)
        # 3.保存数据
        self.save(last_day_corona_virus,
                  'Web_spider/data/last_day_corona_virus.json')

    def crawl_last_virus(self):
        """
        采集从1月23日以来各国疫情数据
        """
        # 1.加载各国疫情数据
        with open('Web_spider\data\last_day_corona_virus.json',
                  encoding='utf-8') as fp:
            last_day_corona_virus = json.load(fp)
        # 2.遍历各国疫情数据
        corona_virus = []  # 列表用于存储各国从1月23日以来疫情数据
        for country in tqdm(last_day_corona_virus,desc='采集1月23日以来的各国疫情信息'):
            # 3.发送请求获取各国从1月23日至今的json数据
            statistics_data_url = country['statisticsData']
            statistics_data_json_str = self.get_content_from_url(
                statistics_data_url)
            # 4.json数据转换为python数据添加至列表中
            statistics_data = json.loads(statistics_data_json_str)['data']
            for one_day in statistics_data:
                one_day['provinceName'] = country['provinceName']
                one_day['countryShortCode'] = country['countryShortCode']
            corona_virus.extend(statistics_data)
        # 5.保存列表数据(json格式)保存为文件
        self.save(corona_virus,'Web_spider\data\corona_virus.json')

    def run(self):
        # self.crawl_last_day_corona_virus()
        self.crawl_last_virus()


if __name__ == "__main__":
    spider = CoronaVirusSpider()
    spider.run()
